﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace BusinessLogic
{	
	public interface IKeyEntity:ICloneable
	{		
		// ATTRIBUTS
		string ID { get; }

		//METHODES
		string ToString();

		bool Equals(object oObj);
		bool Equals(IKeyEntity oObj);
		int GetHashCode();
				
		void Dispose();

		bool IsValid();

		//static bool operator==(IKeyEntity k1, IKeyEntity k2);
		//static bool operator!=(IKeyEntity k1, IKeyEntity k2);

		//public static implicit operator String(IKeyEntity oKey);
	}

	public interface IEntityObject:ICloneable
	{
		// ATTRIBUTS

		// Code de l'objet
		IKeyEntity Code	{ get; }		

		// METHODES

		// TEST EGALITE
		bool Equals(object oObj);
		bool Equals(IEntityObject oObj);		

		// COPIE OBJET d'un point de vue Business sans le Code et avec réinitilisation des variables si besoin (ex : compteur)
		//void CopyTo( IEntityObject<T> oObj);

		// TO STRING
		string ToString();

		// CLONE de l'objet : ICloneable
		//object Clone();

		// DESCTRUCTEUR : IDisposable
		void Dispose(); // { Dispose(true); }
		//void Dispose(bool disposing); // true en cas de destruction déterministe, et à false si appelé par le garbage collector
		//~IEntityObject(); // { Dispose(false); } // Finaliseur

		// SURCHARGE OPERATEUR
		// public bool operator ==(IEntityObject t1, typeX t2)	// Opérateur binaire : deux arguments avec 1er de type IEntityObject, 2eme n'importe quel type 
																				// + renvoie une valeur de n'importe quel type
		// public IEntityObject operator ++(IEntityObject t1)	// Opérateur unaire : un argument avec un type IEntityObject
																				// + renvoie une valeur de type IEntityObject
		// OPERATEUR DE CONVERSION
		// public static implicit operator int(IEntityObject t1) 

		// INDEXEUR : permet d'utiliser l'alias EntityObject[i] en pintant vers un conteneur propre à la classe 
		// public typeX this[int n]			// soit avec un indice entier
		// public typeX this[String str]	// soit avec un indice string

		// CONTENEUR PERSO : IEnumerable
		// IEnumerator IEnumerable.GetEnumerator() { return (IEnumerator) GetEnumerator(); }
		// public IEntityObject GetEnumerator() { return new IEntityObject( oConteneur ); }
		
		// TRI SUR HASHTABLE
		//public override int GetHashCode(); // {return getKey().GetHashCode(); }
		int GetHashCode();

		// TRI SUR LIST<T> : IComparable
		//public int ComparaTo( object oObj)

		bool IsRecordable();	
	}

	public interface IFactoryEntity
	{
		IPersonneEntity GetPersonneEntity( IPersonneEntity oPersonneSrc );
		IPersonneEntity GetPersonneEntity( string strNom, string strPrenom, int nAge, string strAdresse );
	}

	public interface IPersonneEntity : IEntityObject
	{
		// ATTRIBUT
		string Nom		{ get; set; }
		string Prenom	{ get; set; }
		int Age			{ get; set; }
		string Adresse	{ get; set; }
		string NomTable { get; }

		// METHODE
		void CopyTo( IPersonneEntity oObj);
	}
}
